package cn.tedu.v3;

import java.io.*;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

/**
 * 多人聊天室 Version 3
 * Server服务器：找到CS多线程类
 *  1.读入放入线程中
 *  2.写出直接写在run方法
 */
public class Server {
    private ServerSocket serverSocket;
    public Server() {
        try {
            serverSocket = new ServerSocket(3690);
        } catch (BindException e){
            System.out.println("端口号已经被占用");
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    public void start() {
            Socket socket = null;
        String ip=null;
        try {
            while(true) {
                System.out.println("等待客户端连接");
                    socket = serverSocket.accept();

                new Thread(new CS(socket)).start();
            }
        } catch (IOException e) {
            System.out.println(ip+"客户端连接失效");
        } finally {
            if (serverSocket!=null&&serverSocket.isClosed()){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    System.out.println("服务器关闭失败~~~");
                }
                System.out.println("服务器关闭成功~~~Over");
            }
        }
    }
    public static void main(String[] args)  {
        Server server=new Server();
        server.start();
    }

    private class CS implements Runnable{
        private Socket socket;
        private String ip;
        public CS(Socket s) {
            this.socket=s;
             ip=socket.getInetAddress().getHostAddress();
        }
        public void run() {
            PrintWriter pw= null;
       //     BufferedReader br = null;
        try {
        //1.2读入操作
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
        //1.1写出操作
        pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF8")),true);
        //1.3创建线程---Lambda表达式---读入功能---存入线程中
        new Thread(()->{
            //1.4在线程中创建变量---接收客户端发来的文本
           try {
            String message;
             while((message=br.readLine())!=null){//读入客户端
              System.out.println("客户端说："+message);
              //1.6增加一句---每一次客户端发给服务器端内容
                 System.out.print("服务器端请输入");
                 }
            } catch (IOException e) {
              System.out.println("客户端发的消息断开了");
                }
            }).start();
        //1.5增加写出操作【修改目的:读入写出通顺】
        //1.5.1控制台卡住---输入内容
            Scanner input=new Scanner(System.in);
        //1.5.2一直写出
         while(true){
            System.out.println("服务器请输入");
            String sme=input.nextLine();
            pw.println("服务器端说"+sme);
                }

            } catch(UnsupportedEncodingException e){
                System.out.println("请检查客户端/服务器端连接：不一致");
            } catch(SocketException e){
                System.out.println("客户端连接被重置");
            } catch (IOException e) {
                System.out.println("客户端连接失效");
            } finally {
              /*  if (br != null)
                    try {
                        br.close();
                    } catch (Exception e) {
                        System.out.println("读入流断开连接");
                    }*/

                if(socket!=null&&!socket.isClosed()){
                    System.out.println(ip+"一个客户端退出服务器连接~~");
                    try {
                        socket.close();
                    } catch (IOException e) {
                        System.out.println(ip+"一个客户端退出链接异常~~");
                    }
                }
            }
        }
    }
}
